package com.wj.crm.service;

import com.wj.crm.base.BaseService;
import com.wj.crm.dao.ModuleMapper;
import com.wj.crm.dao.PermissionMapper;
import com.wj.crm.dao.RoleMapper;
import com.wj.crm.utils.AssertUtil;
import com.wj.crm.vo.Permission;
import com.wj.crm.vo.Role;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author WangJin
 * @version 1.0
 * @date 2022/1/11 21:51
 */
@Service
public class RoleService extends BaseService<Role,Integer> {
    //查询所有角色列表
    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private ModuleMapper moduleMapper;

    public List<Map<String,Object>> queryAllRoles(Integer userId){
        List<Map<String, Object>> roles = roleMapper.queryAllRoles(userId);
        return roles;
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void addRole(Role role){
        //1.参数校验
        AssertUtil.isTrue(StringUtils.isBlank(role.getRoleName()),"角色名不能为空！");
        //2.通过角色查询角色记录
        Role temp = roleMapper.selectByRoleName(role.getRoleName());
        //3.判断角色记录是否存在
        AssertUtil.isTrue(temp != null , "角色名已存在，请重新输入！");
        //设置默认值
        role.setIsValid(1);
        role.setCreateDate(new Date());
        role.setUpdateDate(new Date());

        //4.执行添加操作
        AssertUtil.isTrue(roleMapper.insertSelective(role)<1 ,"角色添加失败！");
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void updateRole(Role role){
        //1.参数校验
        AssertUtil.isTrue(null == role.getId(),"待更新角色不存在！");
        //2.通过id查询角色记录
        Role temp = roleMapper.selectByPrimaryKey(role.getId());
        //3.判断角色记录是否存在
        AssertUtil.isTrue(temp == null , "待更新记录不存在！");
        //角色名称，非空，名称唯一
        AssertUtil.isTrue(StringUtils.isBlank(role.getRoleName()),"角色名称不能为空！");
        //通过角色名称查询角色记录
        temp = roleMapper.selectByRoleName(role.getRoleName());
        //判断角色是否存在（如果数据库角色名存在，修改的角色名和数据库角色名一致且当前更新的角色id与数据库角色id不相同，表示角色名已存在）
        if(null != temp && (role.getRoleName().equals(temp.getRoleName()) && (!role.getId().equals(temp.getId())))){
            AssertUtil.isTrue(true,"角色名已存在，请重新输入！");
            //判断角色信息是否修改（如果数据库角色名存在，修改的角色名和数据库角色名一致且当前更新的角色id与数据库角色id相同时，修改信息没变，表示角色信息未修改）
        }else if( null != temp && (role.getRoleName().equals(temp.getRoleName())) && (role.getId().equals(temp.getId())) ){
            AssertUtil.isTrue(role.getRoleRemark().equals(temp.getRoleRemark()),"角色信息未修改，请重新输入！");
        }
        //设置默认参数
        role.setUpdateDate(new Date());
        //4.执行添加操作
        AssertUtil.isTrue(roleMapper.updateByPrimaryKeySelective(role)<1 ,"角色修改失败！");
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteRole(Integer roleId) {
        //判断角色ID是否为空
        AssertUtil.isTrue( null == roleId,"待删除记录不存在！");
        //通过角色ID查询角色记录
        Role role = roleMapper.selectByPrimaryKey(roleId);
        //判断角色记录是否存在
        AssertUtil.isTrue(null == role,"待删除记录不存在！");
        //设置删除状态
        role.setIsValid(0);
        role.setUpdateDate(new Date());
        //执行更新操作
        AssertUtil.isTrue(roleMapper.updateByPrimaryKeySelective(role) < 1 ,"角色删除失败！");
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void addGrant(Integer roleId, Integer[] mIds) {
        //1.通过角色id查询对应的权限记录
       Integer count = permissionMapper.countPermissionByRoleId(roleId);
       //2.如果权限记录存在，则删除对应的角色拥有的权限记录
        if(count > 0){
            //删除权限记录
            permissionMapper.deletePermissionByRoleId(roleId);
        }
        //3。如果有权限记录，则添加权限记录
        if(mIds != null && mIds.length > 0){
            //定义Permission集合
            List<Permission> permissionList = new ArrayList<>();
            //遍历资源Id数组
            for (Integer mId : mIds) {
                Permission permission = new Permission();
                permission.setModuleId(mId);
                permission.setRoleId(roleId);
                permission.setAclValue(moduleMapper.selectByPrimaryKey(mId).getOptValue());
                permission.setCreateDate(new Date());
                permission.setUpdateDate(new Date());
                //将对象设置到集合中
                permissionList.add(permission);
            }

            //执行批量添加操作，判断受影响行数
            AssertUtil.isTrue(permissionMapper.insertBatch(permissionList) != permissionList.size(),"角色授权失败！");
        }

    }
}
